Como desplegar servlets en un servidor Jetty
Los servlets no tienen función main las clases que generamos se cargan directamente en el servidor que actua de container, en este caso podríamos decir que el punto de entrada (la función main), está en el servidor.
IMPORTANTE !!
En jetty 11 se implementan los servlets con jakarta, pero en jetty 10 los servlets se implementan con javax, tenemos que tener esto en cuenta a la hora de importar la librería de servlets en nuestro código.
| Jetty | Servlet | EE | Namespace |
|---|---|---|---|
| Jetty 10.x | Servlet 4.0 | Jakarta EE 8 | javax.servlet |
| Jetty 11.x | Servlet 5.0 | Jakarta EE 9 | jakarta.servlet |
Primero configuramos la variable JETTY_HOME para que apunte a la carpeta en la que tenemos instalada jetty:
Ejecutamos el siguiente comando para generar un proyecto con jetty desplegado:
(El proyecto se genera en la carpeta que estemos, es mejor lanzar el comando en una carpeta vacia.)
java -jar %JETTY_HOME%/start.jar --add-module=server,http,deploy
Esto generará un scafolding con una serie de carpetas.
En la carpeta webapps es donde pondremos la aplicación que queremos desplegar en el servidor.
A continuación desarrollamos el servlet que queremos desplegar en el servidor jetty.
Para hacer el servlet generamos el siguiente scafolding:
En este caso lo generamos directamente en la carpeta webapps, pero podemos crear la carpeta en cualquier otro lugar y moverla mas adelante si queremos a la carpeta webapps.
En el index.html, ponemos el siguiente código:
<html>
<body>
<form action="saludo" method="get">
<span>Nombre</span> <input type="text" name="nombre" /><br />
<input type="submit" value="login" />
</form>
</body>
</html>
En el WEB-INF/web.xml ponemos el siguiente código:
<web-app>
<servlet>
<servlet-name>EjemploServlet</servlet-name>
<servlet-class>Ejemplo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>EjemploServlet</servlet-name>
<url-pattern>/saludo</url-pattern>
</servlet-mapping>
</web-app>
En el WEB-INF/classes/Ejemplo.java ponemos el siguiente código:
import jakarta.servlet.http.*;
import jakarta.servlet.*;
import java.io.*;
public class Ejemplo extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter pw = res.getWriter();
String name = req.getParameter("name");
pw.println("Hola " + name);
}
}
A continuación compilamos nuestra clase Ejemplo.java con el siguiente comando (Tenemos que ponernemos en la carpeta classes):
javac -cp jakarta.servlet-api-5.0.0.jar Ejemplo.java
NOTA: necesitamos poner la librería jakarta.servlet-api-5.0.0.jar en el directorio classes, si no tenemos está librería obtendremos el siguiente error:
Una vez lo tenemos compilado nos ponemos en la carpeta raiz del proyecto y ejecutamos el siguiente comando, para lanzar el servidor:
java -jar %JETTY_HOME%/start.jar
Una vez se ejecuta el comando podemos acceder con el navegador a http://127.0.0.1:8080/ServletEjemplo
Y ya tendremos nuestro servlet ejecutandose en el servidor, en este caso simplemente es un formulario que manda una variable y la muestra.
Si queremos en vez de poner toda la carpeta de nuestro servlet dentro de la carpeta webapps, podemos generar un archivo .war de nuestro servlet y meterlo directamente en la carpeta webapps.
Para generar el archivo .war lo hacemos con el siguiente comando:
jar -cvf ejemplo.war *
El comando lo ejecutamos dentro de la carpeta del servlet, en este caso ServletEjemplo
Una vez ejecutado el comando se genera el archivo ejemplo.war dentro de la carpeta ServletEjemplo, el archivo .war tenemos que moverlo a la carpeta webapps, así que ahora tendríamos dos servlets, el del .war y el de la carpeta:
Para acceder al servlet que acabamos de generar del .war entraríamos en la dirección http://127.0.0.1:8080/ejemplo/
Al tener configuraciones en el archivo web.xml que requieran de modulos externos como esta:
<filter>
<filter-name>cross-origin</filter-name>
<filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
</filter>
Podemos encontrarnos con un error como este al ejecutar el servidor:
java.lang.ClassNotFoundException: org.eclipse.jetty.servlets.CrossOriginFilter
Esto se da porque estos modulos tenemos que ponerlos dentro de una carpeta lib dentro de la carpeta WEB-INF (webapp/WEB-INF/lib), en este caso tendríamos que poner el jar jetty-servlets-10.0.12.jar dentro de la carpeta lib.
NOTA: nunca llegué a probar el CORS con jetty, esto fue resultado de una prueba que hice con App Engine para permitir solicitudes CORS, pero al final se solucionaba de otra manera (exlpicada en la seccion de CORS)
Jetty | Servlets | java